package Point.SlipWindow;


import org.junit.Test;
import org.w3c.dom.ls.LSOutput;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 普适技巧：
 *   找代码位置：
 *      while/if 汉译
 *   debug：
 *      对 草稿 的 index (脑袋逻辑混乱时，也可立刻发现错误)
 *
 * 滑窗技巧：
 *   只管 核心 （ eg. needWindow / 重复的那 1个 字符 ）
 *
 * [本题卡点]
 *   maxLen = Math.max(maxLen, right - left); // * 注意 r动也要收集 （r超了 中间while会帮你缩 好牛！）
 *
 */
public class 无重复字符的最长子串3 {

    /*
        改用 Map 统计个数 -> 换个思路 轻松ac （不要纠结自己的思路）
     */
    public int lengthOfLongestSubstring(String s) {
        if(s=="" || s.length()==0) return 0;
        int maxLen = 0;
        Map<Character, Integer> charNumMap = new HashMap<>();
        int left = 0, right = 0;

        while (right < s.length()) {

            char curRight = s.charAt(right);
            right++;
            charNumMap.put(curRight, charNumMap.getOrDefault(curRight,0)+1);

            System.out.println(String.format("window: [%d, %d)\n", left, right));

            while (charNumMap.get(curRight) > 1) {
                // x 这里是有重复 不能收集maxLen while汉译(又忘用)
                char curLeft = s.charAt(left);
                left++;
                charNumMap.put(curLeft, charNumMap.get(curLeft)-1);
            }//-> char个数 = 1

            maxLen = Math.max(maxLen, right - left); // * 注意 r动也要收集 （r超了 中间while会帮你缩 好牛！）

        }
        return maxLen;
    }

    @Test
    public void test() {
        // System.out.println("RES:" + lengthOfLongestSubstring("abcabcbb"));
        System.out.println("RES:" + lengthOfLongestSubstring("tmmzuxt"));
    }
}
